home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -in_the_mag- / reader_requests / amiga-e / examples / inputhandler.e < prev    next >
Text File  |  1999-09-13  |  9KB  |  247 lines

  1. /*
  2. **  Original C Code written by Stefan Stuntz
  3. **
  4. **  All comments taken from the c-source
  5. **
  6. **  Translation into E by Klaus Becker
  7. **  
  8. */
  9.  
  10. OPT PREPROCESS
  11.  
  12. MODULE 'amigalib/boopsi'
  13. MODULE 'devices/timer'
  14. MODULE 'exec/ports','exec/io'
  15. MODULE 'intuition/classes', 'intuition/classusr'
  16. MODULE 'muimaster', 'libraries/mui'
  17. MODULE 'mui/muicustomclass'
  18. MODULE 'utility/tagitem', 'utility/hooks'
  19.  
  20. /* Instance Data */
  21.  
  22. OBJECT mydata
  23.   port:PTR TO mp
  24.   req:PTR TO timerequest
  25.   ihnode:mui_inputhandlernode_timer
  26.   index
  27. ENDOBJECT
  28.  
  29. /* Attributes and methods for the custom class */
  30.  
  31. #define MUISERIALNR_STUNTZI 1
  32. #define TAGBASE_STUNTZI (TAG_USER OR Shl(MUISERIALNR_STUNTZI,16))
  33. #define MUIM_Class5_Trigger (TAGBASE_STUNTZI OR 1)
  34.  
  35. /* IO macros */
  36.  
  37. #define IO_SIGBIT(req)  (req::io.mn.replyport.sigbit)
  38. #define IO_SIGMASK(req) (Shl(1,IO_SIGBIT(req)))
  39.  
  40. /* Some strings to display */
  41.  
  42. DEF lifeOfBrian:PTR TO LONG
  43.  
  44. /***************************************************************************/
  45. /* Here is the beginning of our new class...                               */
  46. /***************************************************************************/
  47.  
  48. PROC mNew(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  49.   DEF data:PTR TO mydata,port,req
  50.   IF (obj := doSuperMethodA(cl,obj,msg))=NIL THEN RETURN (0)
  51.   data := INST_DATA(cl,obj)
  52.   IF (port := CreateMsgPort())
  53.     data.port:=port
  54.     IF (req := CreateIORequest(data.port,SIZEOF timerequest))
  55.       data.req:=req
  56.       IF (OpenDevice(TIMERNAME,UNIT_VBLANK,data.req,0)=NIL)
  57.         data.ihnode.ihn_object  := obj
  58.         data.ihnode.ihn_millis  := 1000
  59.         data.ihnode.ihn_method  := MUIM_Class5_Trigger
  60.         data.ihnode.ihn_flags   := MUIIHNF_TIMER
  61.  
  62.         data.index := 0
  63.         RETURN (obj)
  64.       ENDIF
  65.     ENDIF
  66.   ENDIF
  67.   coerceMethodA(cl,obj,OM_DISPOSE)
  68. ENDPROC
  69.  
  70. PROC mDispose(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  71.   DEF data:PTR TO mydata
  72.   data := INST_DATA(cl,obj)
  73.  
  74.   IF (data.req)
  75.     IF (data.req.io.device) THEN CloseDevice(data.req)
  76.     DeleteIORequest(data.req)
  77.   ENDIF
  78.  
  79.   IF (data.port) THEN DeleteMsgPort(data.port)
  80. ENDPROC (doSuperMethodA(cl,obj,msg))
  81.  
  82. PROC mSetup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  83.   DEF data:PTR TO mydata,ih
  84.   data := INST_DATA(cl,obj)
  85.  
  86.   IF (doSuperMethodA(cl,obj,msg))=NIL THEN RETURN FALSE
  87.   data.req.io.command := TR_ADDREQUEST
  88.   data.req.time.secs    := 1
  89.   data.req.time.micro   := 0
  90.   SendIO(data.req)
  91.   doMethodA(_app(obj),[MUIM_Application_AddInputHandler,data.ihnode])
  92. ENDPROC (TRUE)
  93.  
  94. PROC mCleanup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  95.   DEF data:PTR TO mydata,ih
  96.   data := INST_DATA(cl,obj)
  97.   doMethodA(_app(obj),[MUIM_Application_RemInputHandler,data.ihnode])
  98.   IF (CheckIO(data.req)=NIL) THEN AbortIO(data.req)
  99.   WaitIO(data.req)
  100. ENDPROC (doSuperMethodA(cl,obj,msg))
  101.  
  102. PROC mTrigger(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  103.   DEF data:PTR TO mydata
  104.   data := INST_DATA(cl,obj)
  105.  
  106.   set(obj,MUIA_Text_Contents,lifeOfBrian[data.index])
  107.   data.index:=data.index+1
  108.   IF (lifeOfBrian[data.index])=NIL
  109.     data.index := 0
  110.     RETURN (FALSE)
  111.   ENDIF
  112. ENDPROC
  113.  
  114. /*
  115. ** Here comes the dispatcher for our custom class.
  116. */
  117.  
  118. PROC myDispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  119.   DEF methodid
  120.   methodid:=msg.methodid
  121.   SELECT methodid
  122.     CASE OM_NEW             ; RETURN (mNew    (cl,obj,msg))
  123.     CASE OM_DISPOSE         ; RETURN (mDispose(cl,obj,msg))
  124.     CASE MUIM_Setup         ; RETURN (mSetup  (cl,obj,msg))
  125.     CASE MUIM_Cleanup       ; RETURN (mCleanup(cl,obj,msg))
  126.     CASE MUIM_Class5_Trigger; RETURN (mTrigger(cl,obj,msg))
  127.   ENDSELECT
  128. ENDPROC (doSuperMethodA(cl,obj,msg))
  129.  
  130. /***************************************************************************/
  131. /* Thats all there is about it. Now lets see how things are used...        */
  132. /***************************************************************************/
  133.  
  134. PROC main() HANDLE
  135.   DEF app,window,myObj,sigs=0
  136.   DEF mcc=NIL:PTR TO mui_customclass
  137.  
  138.   IF (muimasterbase:=OpenLibrary(MUIMASTER_NAME, MUIMASTER_VMIN))=NIL THEN
  139.       Raise('Failed to open muimaster.library')
  140.  
  141.   lifeOfBrian:=['Cheer up, Brian. You know what they say.',
  142.                 'Some things in life are bad,',
  143.                 'They can really make you mad.',
  144.                 'Other things just make you swear and curse.',
  145.                 'When you\are chewing on life\as grissle,',
  146.                 'Don\at grumble, give a whistle.',
  147.                 'And this\all help things turn out for the best,',
  148.                 'And...',
  149.                 'Always look on the bright side of life',
  150.                 'Always look on the light side of life',
  151.                 'If life seems jolly rotten,',
  152.                 'There\as something you\ave forgotten,',
  153.                 'And that\as to laugh, and smile, and dance, and sing.',
  154.                 'When you\are feeling in the dumps,',
  155.                 'Don\at be silly chumps,',
  156.                 'Just purse your lips and whistle, that\as the thing.',
  157.                 'And...',
  158.                 'Always look on the bright side of life, come on!',
  159.                 'Always look on the right side of life',
  160.                 'For life is quite absurd,',
  161.                 'And death\as the final word.',
  162.                 'You must always face the curtain with a bow.',
  163.                 'Forget about your sin,',
  164.                 'Give the audience a grin.',
  165.                 'Enjoy it, it\as your last chance anyhow,',
  166.                 'So...',
  167.                 'Always look on the bright side of death',
  168.                 'Just before you draw your terminal breath.',
  169.                 'Life\as a piece of shit,',
  170.                 'When you look at it.',
  171.                 'Life\as a laugh, and death\as a joke, it\as true.',
  172.                 'You\all see it\as all a show,',
  173.                 'Keep \aem laughing as you go,',
  174.                 'Just remember that the last laugh is on you.',
  175.                 'And...',
  176.                 'Always look on the bright side of life !',  
  177.                 '...',
  178.                 '*** THE END ***',
  179.                 '',
  180.                 NIL]
  181.  
  182.   /* Create the new custom class with a call to eMui_CreateCustomClass(). */
  183.   /* Caution: This function returns not a struct iclass, but a            */
  184.   /* struct mui_customclass which contains a struct iclass to be          */
  185.   /* used with NewObjectA() calls.                                        */
  186.   /* Note well: MUI creates the dispatcher hook for you, you may          */
  187.   /* *not* use its h_Data field! If you need custom data, use the         */
  188.   /* cl_UserData of the iclass structure!                                 */
  189.  
  190.   IF (mcc:=eMui_CreateCustomClass(NIL,MUIC_Text,NIL,SIZEOF mydata,{myDispatcher}))=NIL THEN
  191.     Raise('Could not create custom class.')
  192.   app := ApplicationObject,
  193.     MUIA_Application_Title      , 'Class5',
  194.     MUIA_Application_Version    , '$VER: Class5 13.57 (30.01.96)',
  195.     MUIA_Application_Copyright  , 'c1993, Stefan Stuntz',
  196.     MUIA_Application_Author     , 'Stefan Stuntz & Klaus Becker',
  197.     MUIA_Application_Description, 'Demonstrate the use of custom classes.',
  198.     MUIA_Application_Base       , 'Class5',
  199.     SubWindow, window := WindowObject,
  200.       MUIA_Window_Title, 'Input Handler Class',
  201.       MUIA_Window_ID   , "CLS5",
  202.       WindowContents, VGroup,
  203.         Child, TextObject,
  204.           TextFrame,
  205.           MUIA_Background, MUII_TextBack,
  206.           MUIA_Text_Contents, '\ecDemonstration of a class that reacts on\nevents (here: timer signals) automatically.',
  207.         End,
  208.         Child, myObj := NewObjectA(mcc.mcc_class,NIL,
  209.           [TextFrame,
  210.           MUIA_Background, MUII_BACKGROUND,
  211.           MUIA_Text_PreParse, '\ec',
  212.           TAG_END]),
  213.       End,
  214.     End,
  215.   End
  216.  
  217.   IF (app=NIL) THEN
  218.     Raise('Failed to create Application.')
  219.  
  220.   doMethodA(window,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,
  221.     app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])
  222.  
  223. /*
  224. ** This is the ideal input loop for an object oriented MUI application.
  225. ** Everything is encapsulated in classes, no return ids need to be used,
  226. ** we just check if the program shall terminate.
  227. ** Note that MUIM_Application_NewInput expects sigs to contain the result
  228. ** from Wait() (or 0). This makes the input loop significantly faster.
  229. */
  230.  
  231.   set(window,MUIA_Window_Open,MUI_TRUE)
  232.  
  233.   WHILE (doMethodA(app,[MUIM_Application_NewInput,{sigs}]) <> MUIV_Application_ReturnID_Quit)
  234.     IF sigs THEN sigs:=Wait(sigs)
  235.   ENDWHILE
  236.   set(window,MUIA_Window_Open,FALSE)
  237.  
  238. /*
  239. ** Shut down...
  240. */
  241.  
  242. EXCEPT DO
  243.   IF app THEN Mui_DisposeObject(app)     /* dispose all objects. */
  244.   IF mcc THEN Mui_DeleteCustomClass(mcc) /* delete the custom class. */
  245.   IF exception THEN WriteF('\s\n',exception)
  246. ENDPROC
  247.